﻿using System;
using System.Data;
using System.IO;
using DBConnect;

namespace TISS_Add_in
{
    static class Cabecalho
    {
        /// <summary>
        /// Cria o cabeçalho da mensagemTISS que será enviada.
        /// Cadastra no Banco de Dados gerando o sequencialTransacao.
        /// </summary>
        /// <param name="tipoTransacao"></param>
        /// <param name="codPrestadorOrigem"></param>
        /// <param name="regANSDestino"></param>
        /// <returns></returns>
        public static object GeraCabecalho(long codPrestadorOrigem, string regANSDestino, tipoTransacao TipoTransacao)
        {

            DataSet ds = new DataSet();
            ds = CommandModConf.selecionaPrestadorOperadora(codPrestadorOrigem, regANSDestino);
            docTissLoteGuias.cabecalhoTransacao cabecalho = new TISS_Add_in.docTissLoteGuias.cabecalhoTransacao();
            // Verifica se existe registro na tabela Trabalha ligando o prestador com a operadora
            if (ds.Tables[0].Rows.Count > 0)
            {
                long sequelcialTrans = Mensagem.mensagemTISS_adiciona(ds.Tables[0].Rows[0]["codPrestador"].ToString(), ds.Tables[0].Rows[0]["regANS"].ToString(), (int)TipoTransacao);
                if (TipoTransacao > (tipoTransacao)18)
                    TipoTransacao -= 18;
                // identificação transação
                DateTime data = new DateTime();
                data = DateTime.Now;
                cabecalho.identificacaoTransacao = new docTissLoteGuias.cabecalhoTransacaoIdentificacaoTransacao();
                cabecalho.identificacaoTransacao.tipoTransacao = (docTissLoteGuias.st_tipoTransacao)(TipoTransacao - 1);

                //Cadastra mensagemTISS no banco de dados
                cabecalho.identificacaoTransacao.sequencialTransacao = sequelcialTrans.ToString();
                cabecalho.identificacaoTransacao.dataRegistroTransacao = data.ToString("dd/MM/yyyy");
                cabecalho.identificacaoTransacao.horaRegistroTransacao = data.ToString("HH:mm");
                // origem
                docTissLoteGuias.ct_identificacaoPrestadorExecutante origem = new TISS_Add_in.docTissLoteGuias.ct_identificacaoPrestadorExecutante();
                if (ds.Tables[0].Rows[0].ItemArray[2].ToString() != "")
                {
                    origem.ItemElementName = TISS_Add_in.docTissLoteGuias.ItemChoiceType.codigoPrestadorNaOperadora;
                    origem.Item = ds.Tables[0].Rows[0].ItemArray[2].ToString();
                }
                else if (ds.Tables[0].Rows[0].ItemArray[3].ToString() != "")
                {
                    origem.ItemElementName = TISS_Add_in.docTissLoteGuias.ItemChoiceType.CPF;
                    origem.Item = ds.Tables[0].Rows[0].ItemArray[3].ToString();
                }
                else if (ds.Tables[0].Rows[0].ItemArray[4].ToString() != "")
                {
                    origem.ItemElementName = TISS_Add_in.docTissLoteGuias.ItemChoiceType.CNPJ;
                    origem.Item = ds.Tables[0].Rows[0].ItemArray[4].ToString();
                }

                if (origem.Item != null)
                {
                    cabecalho.origem = new docTissLoteGuias.cabecalhoTransacaoOrigem();
                    cabecalho.origem.Item = origem;
                    // destino
                    cabecalho.destino = new docTissLoteGuias.cabecalhoTransacaoDestino();
                    cabecalho.destino.Item = ds.Tables[0].Rows[0].ItemArray[0].ToString();
                    // versão padrão
                    cabecalho.versaoPadrao = docTissLoteGuias.st_versao.Item20103;

                    Stream streamCabecalho = XMLUtils.Serializa(cabecalho, null);

                    switch (TipoTransacao)
                    {
                        case tipoTransacao.ENVIO_LOTE_GUIAS:
                            docTissLoteGuias.cabecalhoTransacao cabecalhoLote = new docTissLoteGuias.cabecalhoTransacao();
                            cabecalhoLote = (docTissLoteGuias.cabecalhoTransacao)XMLUtils.Deserializa(streamCabecalho, typeof(docTissLoteGuias.cabecalhoTransacao), null);
                            return cabecalhoLote;
                        case tipoTransacao.SOLIC_DEMONSTRATIVO_RETORNO:
                            docTissDemonstrativo.cabecalhoTransacao cab_demonstrativo = new docTissDemonstrativo.cabecalhoTransacao();
                            cab_demonstrativo = (docTissDemonstrativo.cabecalhoTransacao)XMLUtils.Deserializa(streamCabecalho, typeof(docTissDemonstrativo.cabecalhoTransacao), null);
                            return cab_demonstrativo;
                        case tipoTransacao.SOLIC_STATUS_PROTOCOLO:
                            docTissStatusProtocolo.cabecalhoTransacao cab_statusProtocolo = new docTissStatusProtocolo.cabecalhoTransacao();
                            cab_statusProtocolo = (docTissStatusProtocolo.cabecalhoTransacao)XMLUtils.Deserializa(streamCabecalho, typeof(docTissStatusProtocolo.cabecalhoTransacao), null);
                            return cab_statusProtocolo;
                        case tipoTransacao.SOLICITACAO_PROCEDIMENTOS:
                            docTissSolicitacaoProcedimento.cabecalhoTransacao cab_solicProcedimento = new docTissSolicitacaoProcedimento.cabecalhoTransacao();
                            cab_solicProcedimento = (docTissSolicitacaoProcedimento.cabecalhoTransacao)XMLUtils.Deserializa(streamCabecalho, typeof(docTissSolicitacaoProcedimento.cabecalhoTransacao), null);
                            return cab_solicProcedimento;
                        case tipoTransacao.PROTOCOLO_RECEBIMENTO:
                            return null;
                        case tipoTransacao.SITUACAO_PROTOCOLO:
                            return null;
                        case tipoTransacao.RESPOSTA_SOLICITACAO:
                            return null;
                        case tipoTransacao.DEMONSTRATIVO_PAGAMENTO:
                            return null;
                        case tipoTransacao.DEMONSTRATIVO_ANALISE_CONTA:
                            return null;
                        case tipoTransacao.DEMONSTRATIVO_ODONTOLOGIA:
                            return null;
                        case tipoTransacao.CANCELAMENTO_GUIA_RECIBO:
                            return null;
                        case tipoTransacao.RE_APRESENTACAO_GUIA:
                            return null;
                        case tipoTransacao.CANCELA_GUIA:
                            docTissCancela.cabecalhoTransacao cab_cancelaGuia = new docTissCancela.cabecalhoTransacao();
                            cab_cancelaGuia = (docTissCancela.cabecalhoTransacao)XMLUtils.Deserializa(streamCabecalho, typeof(docTissCancela.cabecalhoTransacao), null);
                            return cab_cancelaGuia;
                        case tipoTransacao.VERIFICA_ELEGIBILIDADE:
                            return null;
                        case tipoTransacao.SITUACAO_ELEGIBILIDADE:
                            return null;
                        case tipoTransacao.AUTORIZACAO_ODONTOLOGIA:
                            return null;
                        case tipoTransacao.SOLICITA_STATUS_AUTORIZACAO:
                            docTissStatusAutorizacao.cabecalhoTransacao cab_solicStatusAutorizacao = new docTissStatusAutorizacao.cabecalhoTransacao();
                            cab_solicStatusAutorizacao = (docTissStatusAutorizacao.cabecalhoTransacao)XMLUtils.Deserializa(streamCabecalho, typeof(docTissStatusAutorizacao.cabecalhoTransacao), null);
                            return cab_solicStatusAutorizacao;
                        case tipoTransacao.STATUS_AUTORIZACAO:
                            return null;
                    }
                }
                else return null;
            }
            return null;
        }
    }
}
